package visitor;

import operatori.*;
import arbori.*;
import functii.*;

public class DerivareVisitor extends Visitor {
	private String s;
	private ToStringVisitor tsv=new ToStringVisitor();
	public DerivareVisitor(String s)
	{
		this.s=s;
		tsv=new ToStringVisitor();
	}
	public DerivareVisitor()
	{
		this.s="";
	}
	public String getRezultat()
	{
		return this.s;
	}
	public void setRezultat(String rez)
	{
		this.s=rez;
	}
	public void visit(Plus p)
	{
		if((p.getFStang()!=null)&&(p.getFDrept()!=null))
		{
			visit(p.getFStang());
			String s1=this.s;
			visit(p.getFDrept());
			String s2=this.s;
			s=p.concatTermeni(s1,s2);
		}
	}
	public void visit(Minus m)
	{
		if((m.getFStang()!=null)&&(m.getFDrept()!=null))
		{
			visit(m.getFStang());
			String s1=this.s;
			visit(m.getFDrept());
			String s2=this.s;
			s=m.concatTermeni(s1,s2);
		}
	} 
	public void visit(Produs p)
	{
		if((p.getFStang()!=null)&&(p.getFDrept()!=null))
		{
			visit(p.getFStang());
			String f1D=this.s;
			visit(p.getFDrept());
			String f2D=this.s;
			p.getFStang().acceptVisitor(tsv);
			String f1=tsv.getS();
			p.getFDrept().acceptVisitor(tsv);
			String f2=tsv.getS();
			this.s=Plus.concatTermens(Produs.concatTermens(f1D,f2),Produs.concatTermens(f1, f2D));
			
			
		}
	}
	public void visit(Cat c)
	{
		if((c.getFStang()!=null)&&(c.getFDrept()!=null))
		{
			visit(c.getFStang());
			String f1D=this.s;
			visit(c.getFDrept());
			String f2D=this.s;
			c.getFStang().acceptVisitor(tsv);
			String f1=tsv.getS();
			c.getFDrept().acceptVisitor(tsv);
			String f2=tsv.getS();
			this.s=Cat.concatTermens(Minus.concatTermens(Produs.concatTermens(f1D,f2),Produs.concatTermens(f1, f2D)),Produs.concatTermens(f2,f2));
			
			
		}
	}
	public void visit(Constanta c)
	{
		this.s="0";
	}
	public void visit(Necunoscuta n)
	{
		this.s="1";
	}
	public void visit(Sin s)
	{
		if(s.getFStang()!=null)
		{
			visit(s.getFStang());
			String fsd=this.s;
			s.getFStang().acceptVisitor(tsv);
			String fs=tsv.getS();
			this.s=Produs.concatTermens(Cos.concatTermens(fs),fsd);
			
		}
		
	}
	public void visit(Cos c)
	{
		if(c.getFStang()!=null)
		{
			visit(c.getFStang());
			String fsd=this.s;
			c.getFStang().acceptVisitor(tsv);
			String fs=tsv.getS();
			this.s=Produs.concatTermens(Sin.concatTermens(fs),fsd);
			
		}
		
	}
	public void visit(Nod n)
	{
		if(n instanceof Plus)
		{
			visit((Plus)n);
		}
		if(n instanceof Minus)
		{
			visit((Minus)n);
		}
		if(n instanceof Produs)
		{
			visit((Produs)n);
		}
		if(n instanceof Cat)
		{
			visit((Cat)n);
		}
		if(n instanceof Necunoscuta)
			{
			  visit((Necunoscuta)n);
			 }
		  if(n instanceof Constanta)
		    {
			 visit((Constanta)n);
		    }
	     if(n instanceof Sin)
	    {
		   visit((Sin)n);
	    }
	     if(n instanceof Cos)
		    {
			   visit((Cos)n);
		    }
	}
	

}
